第54回 シェル芸勉強会振り返り
まえがき
「jus共催 第54回生ぬるいシェル芸勉強会」に参加してきたのでその振り返り
問題と回答
僕の正答率は 5/8
問1 /icons/fail.icon
つぎのoraora.txtから、「おらおら」など、ある2文字が2回繰り返される単語が2個ある行を、行番号とともに抽出してください。3個以上ある行は抽出しないでください。
ダメでした
以下が回答
code:sh
grep -En '(..)\1.*(..)\2' oraora.txt | grep -Ev '(..)\1.*(..)\2.*(..)\3'
2つマッチさせてから3つ以上マッチした行を削る
問2 /icons/pass.icon
つぎのkouun.txtから、矢印が向いている単語だけを抽出してください>。順番は変わっても構いません。
code:kouun.txt
耕運
↑
幸運
↓
運行
↑
運賃
↓
沈降
↓
うんこ
↑
ウコン
これは解けた
code:sh
cd Sh*/*54
awk '{print $1}' <(cat kouun.txt | paste - - | grep ↑; cat kouun.txt | sed 1d | paste - - | grep ↓ | awk '{print $2, $1}') | sort -u
まず、文字列と矢印を同じ行にする
code:sh
$ paste - - < kouun.txt
耕運 ↑
幸運 ↓
運行 ↑
運賃 ↓
沈降 ↓
うんこ ↑
ウコン
こうすると↑がある行の文字は矢印が向いている対象になる
ということでcat kouun.txt | paste - - | grep ↑で絞り込んでる
次に、下矢印のケース
code:sh
$ sed 1d kouun.txt | paste - -
↑ 幸運
↓ 運行
↑ 運賃
↓ 沈降
↓ うんこ
↑ ウコン
1行目を消してから2列に詰めると、↓が存在する行が対象になる
ということでcat kouun.txt | sed 1d | paste - - | grep ↓ | awk '{print $2, $1}'すると1列目に対象文字、2列めに矢印の行データができる
最後にawkで文字列だけ取り出して、sort -uで重複を捨てれば完成
問3 /icons/fail.icon
だめでした
code:sh
cd Sh*/*54
cat human.txt | uniname | grep Character | awk '{print "0X"$3, $8}' | ruby -lane 'i = Integer($F0); puts i % 2 == 0 ? "b" : "g"' | awk '{m$1++}END{for(k in m)print k, mk}' uninameコマンドを使うとユニコード文字の情報を色々出してくれる
この内、文字コードが偶数だと男性、奇数だと女性らしい
ということでその規則で集計すると解ける
問4 /icons/pass.icon
あ行、か行、さ行・・・わ行の文字の数をそれぞれ求めてください。0個の行は出力する必要はありません。
code:sh
$ cat yoko.txt
よこはまよこすかかみおおおかほりのうちこやす
とけた
code:sh
cd Sh*/*54
for x in あ-お か-こ さ-そ た-と な-の は-ほ ま-も や-よ ら-ろ わをん; do echo -n "$x "; cat yoko.txt | grep -Eo . | sort | grep -Ec "$x"; done 「0個の行は出力しない」ってのを無視してたことに今気づいた
文字を1列にしてから、あ行を正規表現で数えるだけ
code:sh
$ grep -o . yoko.txt | grep -Ec "あ-お" 4
これであ行の数になる
あ-おをか-こにすればか行になる
これをひたすらループで繰り返すだけ
問5-1 /icons/pass.icon
さきほどのURL先にあるファイルから、同じ記号が最も長く続いている部分が何行目にあるか、探してください。行をまたいでいるデータをつなぎあわせて探す必要はありません。
このファイル
解けた
code:sh
grep -n $(grep -Eo 'A+|C+|G+|T+' Figure1Figure2_032321.fasta | awk '{print length($1), $1}' | sort --n | tail -n 1 | awk '{print $2}') Figure1Figure2_032321.fasta
出てくる記号はA,C,G,Tだけなので、Aが連続するかCが連続するかGが連続するかTが連続するかの正規表現で絞り込む
grep -Eo 'A+|C+|G+|T+' Figure1Figure2_032321.fasta
マッチした部分だけ抽出したら文字の長さと一緒に出力する
awk '{print length($1), $1}'
文字長でソート
sort --n
最後の行の文字が一番長いので取り出す
tail -n 1 | awk '{print $2}'
問題は何行目かを聞かれてるので、取り出した文字をそのままgrepに渡して完了
問5-2 /icons/pass.icon
データが行をまたいでいることも考慮して、同じ記号が最も長く続いている部分が何行目(〜何行目)か、探してください。
code:sh
for x in 'head -n 53' 'tail -n 50'; do sed '/>/d' Figure1Figure2_032321.fasta | eval "$x" | tr -d '\r\n' | grep -Eo 'A+|C+|G+|T+' | awk '{print length($1), $1}' | sort -n | tail -n 1 | awk '{print $2}'; done
元ファイルには2つデータが存在するので、2パターン処理する
行頭に>がある行はいらないので削除
sed '/>/d' Figure1Figure2_032321.fasta
データ部分のみに取り出す
1つめのデータの場合はhead -n 53
2つめのデータの場合はtail -n 50
2ループで処理したいのでevalで渡された引数をコマンドとして実行するようにした
for x in 'head -n 53' 'tail -n 50'; do sed '/>/d' Figure1Figure2_032321.fasta | eval "$x" | ...; done
改行文字はCRLFなのでCRLFとして削除
tr -d '\r\n'
あとは問5-1と同じ
問6 /icons/pass.icon
次のjugem.txtから、
$ cat jugem.txt
寿限無寿限無五劫のすりきれ海砂利水魚の水行末雲来末風来末食う寝るところに住むところやぶらこうじのぶらこうじパイポパイポパイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピーのポンポコナの長久命の長助
次のような出力を得てください。
寿水行ころパイーリンポ
限の末とやポポグンポコ
無魚雲むぶイののダのナ
寿水来住らパシンイーの
限利末にこポュガグピ長
無砂風ろうイーンーコ久
五海来こじパリリリポ命
劫れ末とのじンーンンの
のき食るぶうガュダポ長
すりう寝らこンシイの助
左上から下右上右とジグザグに並べる
解けた
code:sh
cd Sh*/*54
cat jugem.txt | grep -Eo '.{10}' | awk '{print $1, NR%2==0}' | teip -g '1$' -- rev | tr -d '01 ' | tate -s | tr -d ' ' | rev
teipやtateなどのコマンドをガッツリ使ってる
10文字に抽出
grep -Eo '.{10}'
奇数行と偶数行と判別できるマークをつける
awk '{print $1, NR%2==0}'
teipで偶数行のときだけrevに食わせる
teip -g '1$' -- rev
判別用につけたマークはいらないので削除
tr -d '01 '
tateで縦書きに変換
tate -s
空白文字がいらなかったので削除してから行を反転
tr -d ' ' | rev
問7 /icons/fail.icon
次のnejineji.txtの文を1行にしてください。
code:txt
寿限無寿限無五劫のすりきれ
海
じのぶらこうじパイポパ 砂
う イ 利
こ グーリンダイグ ポ 水
ら の ー パ 魚
ぶ ン コピー リ イ の
や ガ ポ ン ポ 水
ろ ン ンポのイダ の 行
こ リ シ 末
と ーュシンガンリーュ 雲
む 来
住にろことる寝う食末来風末
手も足も出なかった...
あとその後LTやるつもりでいたのでLT資料書く方に時間を回してしまった(この時点でスライドが書きかけだった)
あとで解説を書く
感想
最後のねじねじ問題以外はシェル芸の得意な問題だと思った
思いつけばあっさり解ける問題が多くて良かったと思う
最後のねじねじはシェル芸のめちゃくちゃ苦手な問題だと思った
普通にスクリプト言語でスクリプト組むのがベターだと思う
僕です
手軽に視聴できないデメリットが強そうなので、次はYoutubeで配信するようにしようかな...
あとDiscordの上田先生の音声だけミュートになっていたことに配信後に気づいた
多分前回の勉強会の時にDiscordチャンネルに入ってYoutubeの配信を見ていた時にDiscord側をミュートにしてそのまま戻すのを忘れていた
ちゃんと確認せねば...
ちなみに発表スライドはMarkdownで書いている
JavaScriptでShellScriptできるらしい"ZX"を試してみた
発表者: ぶる
タイトルメモしとけばよかった
素のJavaScriptで外部コマンドを使う場合、結構コード量が増えてしまうのが楽になる
シェル芸に目覚める前と後
発表者: 病葉(わくらば)
タイトルメモしとけばよかった
出版しているラズパイの本の第2版を作成するにあたって、シェル芸を学んだことで変わった内容についての話
シェル芸を組み込んだことで以下のメリットが得られた
エディタを起動して設定を書き換えるオペレーションを減らせた
手順が簡略になった